﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.Net.Mail;
using System.Net;
using produccion;
using System.Collections.ObjectModel;

using Outlook = Microsoft.Office.Interop.Outlook;
using System.Threading;
using System.Globalization;
using System.Windows.Controls.Primitives;
namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para frmPedMatPr.xaml
    /// </summary>
    public partial class frmPedMatPr : Window
    {
        bool Nuevo;
        CLSENCPPRP EncPprp = new CLSENCPPRP();
        CLSDETPPRP DetPprp = new CLSDETPPRP();
        CLSMAEPRVP MaePrvP = new CLSMAEPRVP();
        DataTable dtEnc = new DataTable();
        DataTable dtDet = new DataTable();
        ObservableCollection<RegDetPed> Lista = new ObservableCollection<RegDetPed>();
        int IntPosicionActualGrid_dgDetalle;//FJRF - Variable que se usara para averiguar la posicion del grid
        int IntColumnaActualGrid_dgDetalle;//FJRF - Variable que se usara para averiguar la posicion del grid

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto
        
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer las funciones que se encuentran en esta clase
        String StrCodigoRetornado = "";//FJRF - Variable que contendra el codigo retornado por la ventana de ayudas

        Boolean BooFechaModificadaPrimeraVez = false;//FJRF - Esta variable la usaremos para validar las fechas y sobre todo cuando la hecha ya haya sido digitada

        //String StrRutaReporteCrystalReport = @"C:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports

        public frmPedMatPr()
        {
            InitializeComponent();
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
                Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
                Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

                #region FJRF - EstilosParaDataGrid
                //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

                ////FJRF - GRID DE ARRIBA
                //dgPedidos.Columns[1].CellStyle = MyStyleTransparent;
                //dgPedidos.Columns[2].CellStyle = MyStyleTransparent;
                //dgPedidos.Columns[3].CellStyle = MyStyleTransparent;

                ////FJRF - GRID DE ABAJO
                //dgDetalle.Columns[0].CellStyle = MyStyleTransparent;
                //dgDetalle.Columns[1].CellStyle = MyStyleTransparent;

                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                //FJRF - GRID DE ARRIBA
                dgPedidos.Columns[0].CellStyle = MyStyleTextAlignmentProperty;
                dgPedidos.Columns[4].CellStyle = MyStyleTextAlignmentProperty;
                dgPedidos.Columns[5].CellStyle = MyStyleTextAlignmentProperty;

                //FJRF - GRID DE ABAJO
                dgDetalle.Columns[2].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[3].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[4].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[5].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[6].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[7].CellStyle = MyStyleTextAlignmentProperty;
                dgDetalle.Columns[8].CellStyle = MyStyleTextAlignmentProperty;
                #endregion

                dtpFecPed.DisplayDateStart = MDOgeneral.DttFechaInicialDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas iniciales que debe mostrar
                dtpFecPed.DisplayDateEnd = MDOgeneral.DttFechaFinalDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas finales que debe mostrar

                dtpFecPed.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema
                dtpFecEnt.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

                txtExplosion.Style = null;
                txtObserv.Style = null;

                Nuevo = false;
                dtEnc = EncPprp.PedidosPorAutorizar();
                dgPedidos.ItemsSource = dtEnc.DefaultView;
                cnvPedidos.Visibility = Visibility.Hidden;

                PrivV_Nuevo();//FJRF - Cargamos la funcion de nuevo
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al cargar pedidos por autorizar", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            Keyboard.Focus(txtCodPrv);
        }
        private void dtpFecPed_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtpFecPed.SelectedDate != null)//FJRF - Verificamos que la fecha no venga nula
            {
                MDOgeneral.DttFechaDigitadaPorusuario = dtpFecPed.SelectedDate.Value;//FJRF - Extraemos ls fecha digitada por el usuario

                if (btnGrabar.Visibility == Visibility.Visible)//FJRF - Si el grabar esta habilitado hacemos la validacion
                {
                    #region FJRF - ValidamosFechaDigitada
                    if (BooFechaModificadaPrimeraVez == true)
                    {
                        if (MDOgeneral.DttFechaDigitadaPorusuario < MDOgeneral.DttFechaInicialDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada es menor a la fecha minima permitida y si lo es hacemos lo siguiente
                        {
                            Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToShortDateString() + " ] no puede ser inferior a la fecha minima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaInicialDeValidacionEnElSistema.ToShortDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                            dtpFecPed.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                        }
                        else//FJRF - Si no es menor la fecha entonces hacemos lo siguiente
                        {
                            if (MDOgeneral.DttFechaDigitadaPorusuario > MDOgeneral.DttFechaFinalDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada el mayor a la fecha maxima permitida y si lo es hacemos lo siguiente
                            {
                                Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToShortDateString() + " ] no puede ser superior a la fecha maxima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaFinalDeValidacionEnElSistema.ToShortDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                                dtpFecPed.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
                            }
                        }
                    }
                    #endregion
                }
            }

        }
        private void dgPedidos_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                string CodPrv;
                Nuevo = false;
                btnNuevo.IsEnabled = true;
                long NroPed;
                if (dgPedidos.SelectedIndex > -1)
                {
                    NroPed = System.Convert.ToInt64(((DataRowView)dgPedidos.Items[dgPedidos.SelectedIndex]).Row["Pedido"].ToString());
                    CodPrv = ((DataRowView)dgPedidos.Items[dgPedidos.SelectedIndex]).Row["Codigo"].ToString();

                    PttV_BuscarOrdenCompra(NroPed, CodPrv);//FJRF - Buscamos orden de compra
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al cargar detalle de pedidos con doble click del mouse", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        protected void PttV_BuscarOrdenCompra(long LngNumeroPedido, String StrCodigoProveedor)//FJRF - Busca las ordenes de compra
        {
            Boolean BooDatoExiste = false;

            btnGrabar.Visibility = Visibility.Visible;
            btnEliminar.Visibility = Visibility.Visible;
            btnMail.Visibility = Visibility.Visible;

            LblMensajeSistema.Content = "";//FJRF - Limpiamos los datos

            expPedidos.IsExpanded = true;
            EncPprp.NROPED_EPP = LngNumeroPedido;
            EncPprp.CODPRV_EPP = StrCodigoProveedor;
            DetPprp.CODPRV_DPP = StrCodigoProveedor;
            DetPprp.NROPED_DPP = LngNumeroPedido;
            txtCodPrv.Text = EncPprp.CODPRV_EPP;

            String StrNombreProveedor = MdoGeneral.StrRetornarUnSoloCampo("NOMPRV_PRV", "PROVEEDOR", "MAEPRVP", "CODPRV_PRV = '" + StrCodigoProveedor + "'");//FJRF - Traemos el nombre del proveedor
            txtNomPrv.Text = StrNombreProveedor;//FJRF - Asignamos el proveedor encontado

            EncPprp.Consultar();
            txtPedido.Text = EncPprp.NROPED_EPP.ToString();
            txtObserv.Text = EncPprp.OBSERV_EPP;

            if (String.IsNullOrEmpty(EncPprp.NROEXP_EPP) == true)
            {
                txtExplosion.Text = "0";
            }
            else
            {
                txtExplosion.Text = EncPprp.NROEXP_EPP;
            }

            dtDet.Clear();
            Lista.Clear();
            dgDetalle.ItemsSource = null;
            dgDetalle.Items.Clear();
            dtDet = DetPprp.Consultar();

            String StrCosto = "";//FJRF - Variable que se usa para validar el dato de costo
            for (int i = 0; i < dtDet.Rows.Count; i++)
            {
                String StrCodigoActual = dtDet.Rows[i][0].ToString();//FJRF - Extraemos el codigo
                if (String.IsNullOrEmpty(StrCodigoActual) == false)//FJRF - Validamos si es nulo o vacio
                {
                    StrCosto = dtDet.Rows[i][8].ToString();//FJRF - Extraemos el costo
                    if (String.IsNullOrEmpty(StrCosto) == true)//FJRF - Validamos si es nulo o vacio
                    {
                        StrCosto = "0";//FJRF - Si el costo es nulo o vacio hacemos lo siguiente
                    }
                    Lista.Add(new RegDetPed 
                    { 
                        CODIGO = StrCodigoActual, 
                        DESCRIPCION = dtDet.Rows[i][1].ToString(), 
                        EXISTENCIA = System.Convert.ToDouble(dtDet.Rows[i][2].ToString()), 
                        CANTIDAD = System.Convert.ToDouble(dtDet.Rows[i][3].ToString()), 
                        RECIBIDO = System.Convert.ToDouble(dtDet.Rows[i][4].ToString()), 
                        DESCARTADO = System.Convert.ToDouble(dtDet.Rows[i][5].ToString()), 
                        ADESCARTAR = System.Convert.ToDouble(dtDet.Rows[i][6].ToString()), 
                        PENDIENTE = System.Convert.ToDouble(dtDet.Rows[i][7].ToString()), 
                        COSTO = System.Convert.ToDouble(StrCosto)
                    });
                }
            }
            Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
            dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista

            dgDetalle.IsEnabled = true;

            if (dgDetalle.Items.Count > 1)
            {
                BooDatoExiste = true;
            }

            if (EncPprp.ESTPED_EPP == "p" || EncPprp.ESTPED_EPP == "")//FJRF - Si el pedido viene de arriba o es un pedido nuevo entonces hacemos lo siguiente
            {
                dgDetalle.Columns[3].IsReadOnly = false;
                dgDetalle.Columns[6].IsReadOnly = true;
            }
            else//FJRF - Si no es un pedido nuevo hacemos lo siguiente
            {
                dgDetalle.Columns[3].IsReadOnly = true;
                dgDetalle.Columns[6].IsReadOnly = false;

                if (EncPprp.ESTPED_EPP == "X")//FJRF - Orden eliminada
                {
                    dgDetalle.Columns[3].IsReadOnly = true;
                    dgDetalle.Columns[6].IsReadOnly = true;

                    LblMensajeSistema.Content = "ORDEN ELIMINADA";

                    btnGrabar.Visibility = Visibility.Hidden;
                    btnEliminar.Visibility = Visibility.Hidden;
                    btnMail.Visibility = Visibility.Hidden;
                }
            }
            if (BooDatoExiste == false)
            {
                dgDetalle.Columns[3].IsReadOnly = false;
                dgDetalle.Columns[6].IsReadOnly = true;

                txtPedido.Focus();
            }
            else
            {
                dgDetalle.Focus();
            }

            BooFechaModificadaPrimeraVez = false;//FJRF - Si es primera vez ponemos el dato en false

            dtpFecPed.Text = EncPprp.FECENT_EPP.ToString();//FJRF - Actualizamos las fechas despues de actualizar el boton guardar que nos dice si es una consulta o no
            dtpFecEnt.Text = EncPprp.FECPED_EPP.ToString();//FJRF - Trae la fecha de entrega

            BooFechaModificadaPrimeraVez = true;//FJRF - Si es primera vez ponemos el dato en false
        }
        private void btnNuevo_Click(object sender, RoutedEventArgs e)
        {
            PrivV_Nuevo();//FJRF - Cargamos la funcion de nuevo
        }
        private void PrivV_Nuevo()
        {
            Nuevo = true;

            LimpiarControles();

            EncPprp.LimpiarValores();
            DetPprp.LimpiarValores();
            DetPprp.CODPRV_DPP = "0";
            DetPprp.NROPED_DPP = 0;
            dtDet = DetPprp.Consultar();
            for (int i = 0; i < dtDet.Rows.Count; i++)
            {
                Lista.Add(new RegDetPed 
                { 
                    CODIGO = dtDet.Rows[i][0].ToString(), 
                    DESCRIPCION = dtDet.Rows[i][1].ToString(), 
                    EXISTENCIA = System.Convert.ToDouble(dtDet.Rows[i][2].ToString()), 
                    CANTIDAD = System.Convert.ToDouble(dtDet.Rows[i][3].ToString()), 
                    RECIBIDO = System.Convert.ToDouble(dtDet.Rows[i][4].ToString()), 
                    DESCARTADO = System.Convert.ToDouble(dtDet.Rows[i][5].ToString()), 
                    ADESCARTAR = System.Convert.ToDouble(dtDet.Rows[i][6].ToString()), 
                    PENDIENTE = System.Convert.ToDouble(dtDet.Rows[i][7].ToString()), 
                    COSTO = System.Convert.ToDouble(dtDet.Rows[i][8].ToString()) 
                });
            }
            Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
            dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista

            txtCodPrv.Focus();
            btnNuevo.IsEnabled = false;

            dgDetalle.Columns[3].IsReadOnly = false;
            dgDetalle.Columns[6].IsReadOnly = true;
        }
        private void LimpiarControles()
        {
            txtCodPrv.Text = "";
            txtPedido.Text = "";
            txtNomPrv.Text = "";
            txtObserv.Text = "";
            txtExplosion.Text = "0";

            BooFechaModificadaPrimeraVez = false;//FJRF - Si es primera vez ponemos el dato en false

            dtpFecPed.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema
            dtpFecEnt.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

            BooFechaModificadaPrimeraVez = true;//FJRF - Si es primera vez ponemos el dato en false

            Lista.Clear();
            dgDetalle.ItemsSource = null;
            dgDetalle.Items.Clear();
            dtDet.Rows.Clear();
        }

        private void txtCodPrv_TextChanged(object sender, TextChangedEventArgs e)
        {
        }

        private void txtCodPrv_LostFocus(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            try
            {
                if (txtCodPrv.Text != "")
                {
                    MaePrvP.CODPRV_PRV = txtCodPrv.Text;
                    if (MaePrvP.existe())
                    {
                         MaePrvP.consultar();
                         txtNomPrv.Text = MaePrvP.NOMPRV_PRV;
                    }
                    else
                    {
                        txtNomPrv.Text = "";
                        txtCodPrv.Text = "";
                    }
                    if (Nuevo)
                    {
                        if (String.IsNullOrEmpty(txtCodPrv.Text) == true)//FJRF - Validamos que el codigo de proveedor tenga datos y si no tiene hacemos lo siguiente
                        {
                            Msgbox("ARVERTENCIA", "El proveedor no existe", MessageBoxButton.OK, MessageBoxImage.Warning);
                            txtCodPrv.Text = "";//FJRF - Limpiamos los datos
                            txtNomPrv.Text = "";//FJRF - Limpiamos los datos
                            txtPedido.Text = "";//FJRF - Limpiamos los datos
                        }
                        else//FJRF - Si trae datos hacemos lo siguiente
                        {
                            txtPedido.Text = EncPprp.Consecutivo(txtCodPrv.Text).ToString();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al consultar el proveedor", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void dgDetalle_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            String StrCodigoMateriaPrima = "";
            int i = dgDetalle.SelectedIndex;
            if (i == -1)
            {
                return;
            }
            if (e.Column.Header.ToString() == "Código")
            {
                string strCodigo = "";
                RegDetPed RgMP = new RegDetPed();
                RgMP = (RegDetPed)dgDetalle.SelectedValue;
                strCodigo = RgMP.CODIGO;
                if (String.IsNullOrEmpty(strCodigo) == false)//FJRF - Validamos si es diferenente de vacio o nulo hacemos lo siguiente
                {
                    if (strCodigo.Length > 10)
                    {
                        MessageBox.Show("La longitud debe ser menor de 10 caracteres", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        RgMP.CODIGO = "";
                        RgMP.DESCRIPCION = "";

                        return;
                    }
                    if (strCodigo.Length == 10)
                    {
                        if (!EncPprp.ExisteMP(strCodigo.ToString().Substring(0, 6), strCodigo.ToString().Substring(6, 4)))
                        {
                            MessageBox.Show("La materia prima no existe", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            RgMP.CODIGO = "";
                            RgMP.DESCRIPCION = "";
                            return;
                        }
                    }
                    else
                    {
                        FRMBuscarCol frm = new FRMBuscarCol();
                        frm.EsReferencia = false;
                        frm.RequiereColor = true;
                        frm.txtNombre.Text = strCodigo;
                        frm.ShowDialog();

                        StrCodigoMateriaPrima = frm.Retorno;
                        if (MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrCodigoMateriaPrima, "-", "Codigo") == "")
                        {
                            for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)
                            {
                                if ((k + i) > i)
                                {
                                    Lista.Add(new RegDetPed { CODIGO = "" });
                                }
                                RgMP = Lista[(i + k)];
                                RgMP.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrCodigoMateriaPrima, "-", "Codigo");
                            }
                        }
                        else
                        {
                            RgMP = Lista[i];
                            RgMP.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrCodigoMateriaPrima, "-", "Codigo");
                        }
                        Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
                        dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
                    }
                }
            }
            else
            {
                if (e.Column.Header.ToString() == "Cantidad")
                {
                    string strCodigo = "";
                    RegDetPed RgMP = new RegDetPed();
                    RgMP = (RegDetPed)dgDetalle.SelectedValue;
                    strCodigo = RgMP.CODIGO;
                    if (strCodigo.Length > 10)
                    {
                        MessageBox.Show("La longitud del código de la materia prima debe ser menor de 10 caracteres", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        RgMP.CODIGO = "";
                        RgMP.DESCRIPCION = "";

                        return;
                    }

                    if (strCodigo.Length < 10)
                    {
                        MessageBox.Show("La longitud del código de la materia prima debe ser igual a 10 caracteres", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        RgMP.CODIGO = "";
                        RgMP.DESCRIPCION = "";
                        return;
                    }
                    if (strCodigo.Length == 10)
                    {
                        if (!EncPprp.ExisteMP(strCodigo.ToString().Substring(0, 6), strCodigo.ToString().Substring(6, 4)))
                        {
                            MessageBox.Show("La materia prima no existe", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            RgMP.CODIGO = "";
                            RgMP.DESCRIPCION = "";
                            return;
                        }
                    }
                }
            }
        }
        private String StrSePuedeGrabar()
        {
            String StrSePuedeGuardar = "SI";
            Boolean BooHayDatos = false;

            RegDetPed RegValida = new RegDetPed();
            for (int i = 0; i < Lista.Count; i++)
            {
                RegValida = Lista[i];
                if (RegValida.CODIGO.Length > 0)
                {
                    BooHayDatos = true;
                }
            }
            if (BooHayDatos == false)
            {
                StrSePuedeGuardar = "No hay materias primas digitadas";
            }
            return StrSePuedeGuardar;
        }
        private void btnGrabar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (StrSePuedeGrabar() == "SI")
                {
                    if (txtObserv.Text.Trim() == "")
                    {
                        MessageBox.Show("Falta digitar una observación", "Grabar pedidos", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }

                    RegDetPed RegValida = new RegDetPed();
                    for (int i = 0; i < Lista.Count; i++)
                    {
                        RegValida = Lista[i];
                        if (RegValida.CANTIDAD < 0)
                        {
                            MessageBox.Show("La cantidad no puede ser menor a cero", "Grabar pedidos", MessageBoxButton.OK, MessageBoxImage.Warning);
                            return;
                        }
                        if (RegValida.ADESCARTAR < 0)
                        {
                            MessageBox.Show("La cantidad a descartar no puede ser menor a cero", "Grabar pedidos", MessageBoxButton.OK, MessageBoxImage.Warning);
                            return;
                        }
                    }

                    if (!txtCodPrv.Text.Equals("") && !txtPedido.Text.Equals(""))
                    {
                        EncPprp.CODPRV_EPP = txtCodPrv.Text;
                        if (btnNuevo.IsEnabled.Equals(false))
                        {
                            txtPedido.Text = EncPprp.Consecutivo(txtCodPrv.Text).ToString();
                        }
                        EncPprp.NROPED_EPP = System.Convert.ToInt64(txtPedido.Text);
                        EncPprp.FECPED_EPP = System.Convert.ToDateTime(dtpFecPed.Text);
                        EncPprp.FECENT_EPP = System.Convert.ToDateTime(dtpFecEnt.Text);
                        EncPprp.OBSERV_EPP = txtObserv.Text;
                        EncPprp.ESTPED_EPP = "P";

                        if (txtExplosion.Text == "")//FJRF - Si esta vacio hacemos lo siguiente
                        {
                            txtExplosion.Text = "0";//FJRF - Le enviamos un vacio porq es un dato que no acepta nulos
                        }

                        if (String.IsNullOrEmpty(txtExplosion.Text.Trim()) == true)
                        {
                            EncPprp.NROEXP_EPP = "0";
                        }
                        else
                        {
                            EncPprp.NROEXP_EPP = txtExplosion.Text;
                        }
                        EncPprp.NROEXP_EPP = txtExplosion.Text;
                        if (EncPprp.ExistePedido())
                        {
                            EncPprp.Actualizar();
                        }
                        else
                        {
                            EncPprp.Insertar();
                        }

                    }
                    RegDetPed Reg = new RegDetPed();
                    for (int i = 0; i < Lista.Count; i++)
                    {
                        Reg = Lista[i];
                        if (String.IsNullOrEmpty(Reg.CODIGO) == false)//FJRF - Si el codigo no es nulo o vacio hacer lo siguiente
                        {
                            if (Reg.CODIGO.Trim().Length == 10)//FJRF - Si el codigo que estamos recorriendo tiene el tamaño correcto hacemos lo siguiente
                            {
                                if (Reg.CANTIDAD > 0)//FJRF - Grabamos los datos que tengas una cantidad mayor a cero
                                {
                                    DetPprp.CODMAT_DPP = Reg.CODIGO.Substring(0, 6);
                                    DetPprp.CODCOL_DPP = Reg.CODIGO.Substring(6, 4);
                                    DetPprp.CANPRO_DPP = Reg.CANTIDAD;
                                    DetPprp.CANDES_DPP = Reg.ADESCARTAR;
                                    DetPprp.CANREC_DPP = Reg.RECIBIDO;
                                    DetPprp.CODPRV_DPP = txtCodPrv.Text;
                                    DetPprp.NROPED_DPP = System.Convert.ToInt64(txtPedido.Text);
                                    DetPprp.COSMTP_DPP = Reg.COSTO;//FJRF - Se agrega el campo costo
                                    if (DetPprp.ExisteRegistro())
                                        DetPprp.Actualizar();
                                    else
                                        DetPprp.Insertar();
                                }
                            }
                        }
                    }

                    MdoGeneral.comando("DELETE FROM DETPPRP WHERE codprv_dpp='" + EncPprp.CODPRV_EPP + "' and nroped_dpp=" + EncPprp.NROPED_EPP + " AND CANPRO_DPP = 0 ");//FJRF - Eliminamos los pedidos que tengan esta condicion

                    Nuevo = false;
                    //using produccion.reportes.Window1;
                    dgDetalle.Columns[3].IsReadOnly = true;
                    dgDetalle.Columns[6].IsReadOnly = false;
                    DataSet ds = new DataSet("DsPedPrv");
                    DataTable d1 = new DataTable("dtEncPprp");
                    DataTable d2 = new DataTable("dtDetPprp");
                    d1 = EncPprp.Imprimir();
                    d1.TableName = "dtEncPprp";
                    d2 = DetPprp.Imprimir();
                    d2.TableName = "dtDetPprp";
                    ds.Tables.Add(d1);
                    ds.Tables.Add(d2);
                    produccion.reportes.Vista frm = new produccion.reportes.Vista();
                    frm.reporte = @"reportes\rptOrdenDeCompra.rpt";
                    frm.ds = ds;
                    frm.Show();

                    new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados correctamente.", true);
                    btnNuevo.IsEnabled = true;
                    Nuevo = false;
                    dtEnc = EncPprp.PedidosPorAutorizar();
                    dgPedidos.ItemsSource = dtEnc.DefaultView;
                    cnvPedidos.Visibility = Visibility.Hidden;

                    PrivV_Nuevo();//FJRF - Cargamos la funcion de nuevo
                }
                else
                {
                    Msgbox("PROCESO CANCELADO", StrSePuedeGrabar(),MessageBoxButton.OK,MessageBoxImage.Error);
                }
            }
            catch (Exception ex)
            {                
                MessageBox.Show(ex.Message, "Error al grabar el pedido.", MessageBoxButton.OK, MessageBoxImage.Error);
                new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados correctamente.", false);
            }
        }

        #region FJRF - MsgboxPersonalizado
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        private void btnBuscar_Click(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            FRMbuscar frm = new FRMbuscar(MaePrvP, "buscar", "Codigo", "NOMPRV_PRV", "Codigo");
            frm.ShowDialog();
            txtCodPrv.Text = frm.retorno;
            if (txtCodPrv.Text != "")
            {
                MaePrvP.CODPRV_PRV = txtCodPrv.Text;
                if (MaePrvP.existe())
                {
                    MaePrvP.consultar();
                    txtNomPrv.Text = MaePrvP.NOMPRV_PRV;
                }
                else
                {
                    txtNomPrv.Text = "";
                    txtCodPrv.Text = "";
                }
            }
        }

        private void txtPedido_LostFocus(object sender, RoutedEventArgs e)
        {
            if (!(txtCodPrv.Text.Equals("")) && !txtPedido.Text.Equals(""))
            {
                dgDetalle.IsEnabled = true;

                Nuevo = false;
                btnNuevo.IsEnabled = true;

                PttV_BuscarOrdenCompra(System.Convert.ToInt64(txtPedido.Text), txtCodPrv.Text);//FJRF - Buscamos orden de compra
            }
            else
            {
                dgDetalle.IsEnabled = false;
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void btnVerPed_Click(object sender, RoutedEventArgs e)
        {
            EncPprp.CODPRV_EPP = txtCodPrv.Text;
            DataTable dt = new DataTable();
            cnvPedidos.Visibility = Visibility.Visible;
            dgConPed.ItemsSource = EncPprp.Buscar().DefaultView;
        }

        private void image2_MouseDown(object sender, MouseButtonEventArgs e)
        {
            cnvPedidos.Visibility = Visibility.Hidden;
        }

        private void dgConPed_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            long NroPed;
            string CodPrv;
            if (!txtCodPrv.Text.Equals(""))
            {
                try
                {
                    CodPrv = txtCodPrv.Text;
                    txtPedido.Text = ((DataRowView)dgConPed.Items[dgConPed.SelectedIndex]).Row["Pedido"].ToString();
                    NroPed = System.Convert.ToInt64(txtPedido.Text);
                    cnvPedidos.Visibility = Visibility.Hidden;
                    expPedidos.IsExpanded = true;
                    EncPprp.NROPED_EPP = NroPed;
                    EncPprp.CODPRV_EPP = CodPrv;
                    DetPprp.CODPRV_DPP = CodPrv;
                    DetPprp.NROPED_DPP = NroPed;
                    txtCodPrv.Text = EncPprp.CODPRV_EPP;
                    EncPprp.Consultar();
                    txtPedido.Text = EncPprp.NROPED_EPP.ToString();
                    dtpFecPed.Text = EncPprp.FECENT_EPP.ToString();
                    dtpFecEnt.Text = EncPprp.FECENT_EPP.ToString();
                    txtObserv.Text = EncPprp.OBSERV_EPP;
                    txtExplosion.Text = EncPprp.NROEXP_EPP;
                    dtDet.Clear();
                    Lista.Clear();

                    dtDet = DetPprp.Consultar();
                    for (int i = 0; i < dtDet.Rows.Count; i++)
                    {
                        Lista.Add(new RegDetPed 
                        { 
                            CODIGO = dtDet.Rows[i][0].ToString(), 
                            DESCRIPCION = dtDet.Rows[i][1].ToString(), 
                            EXISTENCIA = System.Convert.ToDouble(dtDet.Rows[i][2].ToString()), 
                            CANTIDAD = System.Convert.ToDouble(dtDet.Rows[i][3].ToString()), 
                            RECIBIDO = System.Convert.ToDouble(dtDet.Rows[i][4].ToString()), 
                            DESCARTADO = System.Convert.ToDouble(dtDet.Rows[i][5].ToString()), 
                            ADESCARTAR = System.Convert.ToDouble(dtDet.Rows[i][6].ToString()), 
                            PENDIENTE = System.Convert.ToDouble(dtDet.Rows[i][7].ToString()), 
                            COSTO = System.Convert.ToDouble(dtDet.Rows[i][8].ToString()) 
                        });
                    }
                    Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
                    dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista

                    dgDetalle.IsEnabled = true;
                    dgDetalle.Columns[3].IsReadOnly = true;
                    dgDetalle.Columns[6].IsReadOnly = false;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error al cargar el pedido.", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        private void dgDetalle_KeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            RegDetPed RgMP = new RegDetPed();

            try
            {
                RgMP = (RegDetPed)dgDetalle.SelectedValue;
                String strCodigo = RgMP.CODIGO;
                if (String.IsNullOrEmpty(strCodigo) == false)
                {
                    if (strCodigo.Length > 10)
                    {
                        MessageBox.Show("La longitud debe ser menor de 10 caracteres", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        RgMP.CODIGO = RgMP.CODIGO.Substring(0, 10);
                        RgMP.DESCRIPCION = "";
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
            }


            RegDetPed Rg = new RegDetPed();
            if (IntColumnaIndexada == 0)
            {
                if (e.Key == Key.F2)
                {
                    if (EncPprp.ESTPED_EPP == "p" || EncPprp.ESTPED_EPP == "")
                    {
                    }
                    else
                    {
                        Msgbox("","",MessageBoxButton.OK,MessageBoxImage.Stop);//FJRF - Le enviamos un mensaje al usuario
                    }

                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.EsReferencia = false;
                    frm.RequiereColor = true;
                    frm.ShowDialog();

                    if (frm.Retorno == null)
                    {
                        Msgbox("ADVERTENCIA", "No se retorno ningun código", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
                    }
                    else
                    {
                        if (MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.Retorno.ToString(), "-", "Codigo") == "")
                        {
                            for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)
                            {
                                if ((k + IntPosicionActualGrid_dgDetalle) > IntPosicionActualGrid_dgDetalle)
                                {
                                    Lista.Add(new RegDetPed { CODIGO = "" });
                                }
                                Rg = Lista[(IntPosicionActualGrid_dgDetalle + k)];
                                StrCodigoRetornado = frm.dtRetorno.Rows[k][0].ToString();//FJRF - Capturamos el codigo retornado
                                if (StrCodigoRetornado.Trim().Length > 10)//FJRF - Validamos si es mayor a diez, esto significaria que tiene un guion para ser separado por el sistema
                                {
                                    Rg.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrCodigoRetornado, "-", "Codigo");//FJRF - Asignamos el codigo encontrado
                                }
                                else//FJRF - Si no es mayor a 10 entonces hacemos lo siguiente
                                {
                                    Rg.CODIGO = StrCodigoRetornado;//FJRF - Asignamos el dato tal como esta
                                }
                            }
                        }
                        else
                        {
                            Rg = Lista[IntPosicionActualGrid_dgDetalle];
                            StrCodigoRetornado = frm.Retorno.ToString();//FJRF - Capturamos el dato encontrado
                            if (StrCodigoRetornado.Trim().Length > 10)//FJRF - Validamos si es mayor a diez, esto significaria que tiene un guion para ser separado por el sistema
                            {
                                Rg.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrCodigoRetornado, "-", "Codigo");//FJRF - Asignamos el codigo encontrado
                            }
                            else//FJRF - Si no es mayor a 10 entonces hacemos lo siguiente
                            {
                                Rg.CODIGO = StrCodigoRetornado;//FJRF - Asignamos el dato tal como esta
                            }
                        }
                        Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
                        dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
                    }
                }
                if (e.Key == Key.F1)
                {

                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.EsReferencia = false;
                    frm.RequiereColor = true;
                    //Rg = Lista[i];

                    frm.txtNombre.Text = dgDetalle.Items[0].ToString();
                    frm.ShowDialog();
                    if (MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.Retorno.ToString(), "-", "Codigo") == "")
                    {
                        for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)
                        {
                            if ((k + IntPosicionActualGrid_dgDetalle) > IntPosicionActualGrid_dgDetalle)
                            {
                                Lista.Add(new RegDetPed { CODIGO = "" });
                            }
                            Rg = Lista[(IntPosicionActualGrid_dgDetalle + k)];
                            Rg.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.dtRetorno.Rows[k][0].ToString(), "-", "Codigo");
                        }
                    }
                    else
                    {
                        Rg = Lista[IntPosicionActualGrid_dgDetalle];
                        Rg.CODIGO = MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.Retorno.ToString(), "-", "Codigo");
                    }
                    Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
                    dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
                }
            }
        }

        private void btnEliminar_Click(object sender, RoutedEventArgs e)
        {
            #region FJRF - PREGUNTAR SI QUIERE EJECUTAR EL PROCESO
            StrCaptionBox = "Confirmation";//FJRF - Creamos el mensaje para el titulo
            StrMensajeBox = "Esta de eliminar el registro actual?";//FJRF - Creamos el mensaje para el usuario
            MessageBoxButton buttons = MessageBoxButton.YesNo;//FJRF - Creamos el boton
            MessageBoxImage icon = MessageBoxImage.Question;//FJRF - Creamos el icono
            #endregion

            if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Mostramos el mensaje
            {
                try
                {
                    RegDetPed Reg = new RegDetPed();
                    for (int i = 0; i < Lista.Count; i++)
                    {
                        Reg = Lista[i];
                        if (Reg.DESCARTADO > 0 || Reg.RECIBIDO > 0)
                        {
                            MessageBox.Show("No se puede eliminar un pedido con cantidades descartadas o pedidas", "Eliminar pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        EncPprp.CODPRV_EPP = txtCodPrv.Text;
                        EncPprp.NROPED_EPP = System.Convert.ToInt64(txtPedido.Text);
                        EncPprp.Eliminar();
                    }
                    btnNuevo.IsEnabled = true;
                    Nuevo = false;
                    dtEnc = EncPprp.PedidosPorAutorizar();
                    dgPedidos.ItemsSource = dtEnc.DefaultView;
                    cnvPedidos.Visibility = Visibility.Hidden;

                    PttV_Limpiar();//FJRF - Limpiamos los datos

                    StrCaptionBox = "PROCESO EXITOSO";//FJRF - Creamos el titulo
                    StrMensajeBox = "El registro se elimino con exito";//FJRF - Creamos el mensaje
                    Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos la informacion al usuario
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }//FJRF - Si hay algun error lo reportamos
            }
            else
            {
                MessageBoxResult result = MessageBox.Show("Eliminar fue cancelado", "PROCESO CANCELADO");
            }
        }
        private void PvtV_EnviarEmailPorOutLook()
        {
            #region FJRF - PREGUNTAR SI QUIERE EJECUTAR EL PROCESO
            StrCaptionBox = "Confirmation";//FJRF - Creamos el mensaje para el titulo
            StrMensajeBox = "Esta seguro de enviar los correos?";//FJRF - Creamos el mensaje para el usuario
            MessageBoxButton buttons = MessageBoxButton.YesNo;//FJRF - Creamos el boton
            MessageBoxImage icon = MessageBoxImage.Question;//FJRF - Creamos el icono
            #endregion

            if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Mostramos el mensaje
            {
                try
                {
                    #region FJRF - BuscamosLosDatos
                    string strOrdenCompra;//FJRF - Variabla que contiene la orden de compra

                    if (txtPedido.Text == "" || txtCodPrv.Text == "")
                    {
                        return;
                    }
                    EncPprp.CODPRV_EPP = txtCodPrv.Text;
                    DetPprp.CODPRV_DPP = txtCodPrv.Text;
                    EncPprp.NROPED_EPP = System.Convert.ToInt64(txtPedido.Text);
                    DetPprp.NROPED_DPP = System.Convert.ToInt64(txtPedido.Text);
                    DataSet ds = new DataSet("DsPedPrv");
                    DataTable d1 = new DataTable("dtEncPprp");
                    DataTable d2 = new DataTable("dtDetPprp");
                    d1 = EncPprp.Imprimir();
                    d1.TableName = "dtEncPprp";

                    d1.Columns.Add("STRNIT", System.Type.GetType("System.String"));
                    d1.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));
                    d1.Columns.Add("STRDIRECCION", System.Type.GetType("System.String"));

                    d1.Rows[0][d1.Columns.Count - 3] = MDOgeneral.strEmpresaImprimeNit;
                    d1.Rows[0][d1.Columns.Count - 2] = MDOgeneral.strEmpresaImprime;
                    d1.Rows[0][d1.Columns.Count - 1] = MDOgeneral.strEmpresaImprimeDireccion;

                    d1.TableName = "dtEncPprp";

                    strOrdenCompra = d1.Rows[0][d1.Columns.Count - 4].ToString();

                    d2 = DetPprp.Imprimir();
                    d2.TableName = "dtDetPprp";
                    ds.Tables.Add(d1);
                    ds.Tables.Add(d2);
                    #endregion

                    #region FJRF - FormaComoSeExporta
                    String StrNombreConRutaReporteOriginal, StrRutaDondeSeExporta, StrRutaArmadaParaEmailOutlook, StrNombreNuevoDocumentoExportado, StrExtencionArchivo, StrCorreosElectronicosDondeSeEnviaElCorreo = "";//FJRF - Variables que se usan para el envio de correo

                    StrNombreNuevoDocumentoExportado = strOrdenCompra;
                    StrExtencionArchivo = "pdf";

                    StrNombreConRutaReporteOriginal = @"reportes\rptOrdenDeCompra.rpt";//FJRF - Asignamos la ruta donde esta el reporte origina que se va a cargar
                    StrRutaDondeSeExporta = @"\\10.1.1.10\planos\";//FJRF - Asignamos la ruta donde se exportara el archivo

                    produccion.reportes.Vista FrmReporte = new produccion.reportes.Vista();//FJRF - Cargamos las clases que necesitamos que estan en este formulario
                    FrmReporte.ExportarCrystalReport(ds, StrNombreConRutaReporteOriginal, StrRutaDondeSeExporta, StrNombreNuevoDocumentoExportado, StrExtencionArchivo);//FJRF - Enviamos la impresion
                    #endregion

                    #region FJRF - EnviamosElEmailOutlook

                    StrCorreosElectronicosDondeSeEnviaElCorreo = MdoGeneral.StrRetornarUnSoloCampo("EMAIL_PRV", "EmailProveedores", "MAEPRVP", "CODPRV_PRV = '" + txtCodPrv.Text.Trim() + "' ");

                    #region FJRF - Validamos que exista correo donde enviar los datos
                    if (StrCorreosElectronicosDondeSeEnviaElCorreo == "DATO NO ENCONTRADO")//FJRF - Si no se encontro ningunda dato hacemos lo siguiente
                    {
                        StrCorreosElectronicosDondeSeEnviaElCorreo = "ProveedorSinCorreo@mybosi.com";//FJRF - Enviamos un correo por defecto
                    }
                    else//FJRF - Si se encontro el dato hacemos lo siguiente
                    {
                        if (String.IsNullOrEmpty(StrCorreosElectronicosDondeSeEnviaElCorreo) == true)//FJRF - Validamos que el dato encontrado no este vacio o null y si esta asi hacemos lo siguiente
                        {
                            StrCorreosElectronicosDondeSeEnviaElCorreo = "ProveedorSinCorreo@mybosi.com";//FJRF - Enviamos un correo por defecto
                        }
                    }
                    #endregion

                    StrRutaArmadaParaEmailOutlook = StrRutaDondeSeExporta + StrNombreNuevoDocumentoExportado + "." + StrExtencionArchivo;
                    try
                    {
                        //FJRF - Creación de la aplicación Outlook.
                        Outlook.Application oApp = new Outlook.Application();
                        //FJRF - Crear un nuevo elemento de correo.
                        Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
                        //FJRF - Establecer HTMLBody.
                        //FJRF - añadir el cuerpo del correo electrónico
                        oMsg.HTMLBody = "Muy buen día, a continuación adjuntamos la orden de compra número [ " + StrNombreNuevoDocumentoExportado + " ]";
                        //FJRF - Añadir un archivo adjunto.
                        String sDisplayName = "OrdenDeCompraNo_" + StrNombreNuevoDocumentoExportado + " ";
                        int iPosition = (int)oMsg.Body.Length + 1;
                        int iAttachType = (int)Outlook.OlAttachmentType.olByValue;
                        //FJRF - ahora se atribuye el archivo
                        Outlook.Attachment oAttach = oMsg.Attachments.Add(StrRutaArmadaParaEmailOutlook, iAttachType, iPosition, sDisplayName);
                        //FJRF - línea de asunto
                        oMsg.Subject = "Orden de compra No [ " + StrNombreNuevoDocumentoExportado + " ]";
                        //FJRF - Añadir un destinatario.
                        Outlook.Recipients oRecips = (Outlook.Recipients)oMsg.Recipients;
                        //FJRF - Cambie el destinatario en la línea siguiente si es necesario.
                        Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(StrCorreosElectronicosDondeSeEnviaElCorreo);
                        oRecip.Resolve();
                        //FJRF - Enviar.
                        //oMsg.Send(); [Con este comando se envia directamente el correo sin necesidad de abrir el correo]
                        oMsg.Display();
                        //FJRF - Limpiamos
                        oRecip = null;
                        oRecips = null;
                        oMsg = null;
                        oApp = null;
                    }//FJRF - final del bloque try
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message); 
                    }//FJRF - // fin de la captura

                    #endregion

                    #region FJRF - Eliminamos el PdfGenerado [No se pone en funcionamiento porque solo es si se envia sin abrir outlook por pantalla]

                    //if (System.IO.File.Exists(StrRutaArmadaParaEmailOutlook))
                    //{
                    //    try
                    //    {
                    //        System.IO.File.Delete(StrRutaArmadaParaEmailOutlook);
                    //    }
                    //    catch (System.IO.IOException e)
                    //    {
                    //        MessageBox.Show(e.Message); ;
                    //        return;
                    //    }
                    //}

                    #endregion
                }
                catch (Exception ex) 
                { 
                    MessageBox.Show(ex.Message); 
                }//FJRF - Si hay algun error lo reportamos
            }
            else
            {
                MessageBoxResult result = MessageBox.Show("Envio de correos por Outlook cancelado", "PROCESO CANCELADO");
            }
        }
        private void btnMail_Click(object sender, RoutedEventArgs e)
        {
            PvtV_EnviarEmailPorOutLook();//FJRF - Envio de correos
        }

        private void dgPedidos_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void btnImprimir_Click(object sender, RoutedEventArgs e)
        {
            if (txtPedido.Text == "" || txtCodPrv.Text == "")
            {
                return;
            }
            EncPprp.CODPRV_EPP = txtCodPrv.Text;
            DetPprp.CODPRV_DPP = txtCodPrv.Text;
            EncPprp.NROPED_EPP = System.Convert.ToInt64(txtPedido.Text);
            DetPprp.NROPED_DPP = System.Convert.ToInt64(txtPedido.Text);
            DataSet ds = new DataSet("DsPedPrv");
            DataTable d1 = new DataTable("dtEncPprp");
            DataTable d2 = new DataTable("dtDetPprp");
            d1 = EncPprp.Imprimir();
            d1.TableName = "dtEncPprp";

            d1.Columns.Add("STRNIT", System.Type.GetType("System.String"));
            d1.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));
            d1.Columns.Add("STRDIRECCION", System.Type.GetType("System.String"));

            d1.Rows[0][d1.Columns.Count - 3] = MDOgeneral.strEmpresaImprimeNit;
            d1.Rows[0][d1.Columns.Count-2] = MDOgeneral.strEmpresaImprime;
            d1.Rows[0][d1.Columns.Count - 1] = MDOgeneral.strEmpresaImprimeDireccion;

            d1.TableName = "dtEncPprp";

            d2 = DetPprp.Imprimir();
            d2.TableName = "dtDetPprp";
            ds.Tables.Add(d1);
            ds.Tables.Add(d2);
            produccion.reportes.Vista frm = new produccion.reportes.Vista();

            String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptOrdenDeCompra.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
            frm.reporte = StrRutaReporteAImprimir;

            frm.ds = ds;
            frm.Show();
        }

        private void dgPedidos_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }
        private void dgDetalle_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

            IntCantidadRegistros = dgDetalle.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

            IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
            IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una
            
            //--------------------------------------------------------------------------------------------------------------------------------------------------
            
            IntPosicionActualGrid_dgDetalle = IntFilaIndexada;
            IntColumnaActualGrid_dgDetalle = IntColumnaIndexada;

            if (IntColumnaActualGrid_dgDetalle == dgDetalle.Columns.Count - 1)
            {
                IntPosicionActualGrid_dgDetalle = IntPosicionActualGrid_dgDetalle + 1;
            }

            #region FJRF - CodigoParaPasarElFocoDentroDelGrid

            var elemento = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter || e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right && elemento != null)//FJRF - Si se presiono enter, elemento es diferente de nulo o usa las teclas de desplazamiento hacemos lo siguiente
            {
                if (IntFilaActual >= IntRegistrosActuales)//FJRF - Si la fila es mayor o igual a la cantidad de registros hacemos lo siguiente
                {
                    Lista.Add(new RegDetPed { CODIGO = "", DESCRIPCION = "", EXISTENCIA = 0, CANTIDAD = 0, RECIBIDO = 0, DESCARTADO = 0, ADESCARTAR = 0, PENDIENTE = 0, COSTO = 0 });//FJRF - Enviamos un registro en blanco
                    dgDetalle.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
                }
                if (e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right)//FJRF - Si usas las techas de navegacion hacemos lo siguiente
                {
                    //FJRF - No hacer nada para que el foco permanezca en el grid y lo comento aqui para que lo entiendan
                }
                else//FJRF - Si no esta usando las teclas de navegacion hacemos lo siguiente
                {
                    if (IntColumnaIndexada == 0)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                    {
                        if (dgDetalle.Columns[3].IsReadOnly == false)//FJRF - Si la en la columna se permite escribir hacemos lo siguiente
                        {
                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(dgDetalle, IntFilaIndexada, 3);//FJRF - Le decimos cual es la nueva posicion
                        }
                        else//FJRF - Si en la columna no se puede escribir hacemos lo siguiente
                        {
                            if (dgDetalle.Columns[6].IsReadOnly == false)//FJRF - Si la en la columna se permite escribir hacemos lo siguiente
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(dgDetalle, IntFilaIndexada, 6);//FJRF - Le decimos cual es la nueva posicion
                            }
                            else//FJRF - Si en ninguna de las dos culumnas se puede escribir hacemos lo siguiente
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));//FJRF - Nos movemos a la siguiente posicion
                            }
                        }
                    }
                    else//FJRF - si no es la columna del codigo hacemos lo siguiente
                    {
                        if (IntColumnaIndexada == 3 || IntColumnaIndexada == 6)//FJRF - Si la columna equivale a la cantidad entonces hacemos lo siguiente
                        {
                            e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                            SelectCellByIndex(dgDetalle, IntFilaActual, 0);//FJRF - Le decimos cual es la nueva posicion
                        }
                        else//FJRF - Si es cualquier otra celda hacemos lo siguiente
                        {
                            if (IntFilaActual <= IntRegistrosActuales)//FJRF - Si la fila es igual o menor a la cantidad de registros hacemos lo siguiente
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));//FJRF - Nos movemos a la siguiente posicion
                            }
                        }
                    }
                }
            }

            #endregion
        }
        protected void PttV_Limpiar()//FJRF - Limpiamos todos los objetos
        {
            txtCodPrv.Text = "";
            txtNomPrv.Text = "";
            txtPedido.Text = "";
            
            BooFechaModificadaPrimeraVez = false;//FJRF - Si es primera vez ponemos el dato en false
            dtpFecPed.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema
            dtpFecEnt.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema
            BooFechaModificadaPrimeraVez = true;//FJRF - Si es primera vez ponemos el dato en false
            
            txtObserv.Text = "";
            txtExplosion.Text = "0";
            dgDetalle.ItemsSource = null;
            dgDetalle.Items.Clear();
        }
        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }
        private void txtExplosion_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }

        private void txtExplosion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario digita enter entonces hacemos lo siguiente
            {
                dgDetalle.CurrentCell = new DataGridCellInfo(dgDetalle.Items[0], dgDetalle.Columns[0]);//FJRF - Decimos en que fila y columna vamos a trabajar
                dgDetalle.BeginEdit();//FJRF - Decimos que es para edicion
            }
        }

        private void txtPedido_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //FJRF - VALIDACION PARA QUE SOLO ACEPTE NUMEROS (SOLO NUMEROS)
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57) e.Handled = false;
            else e.Handled = true;
        }
    }

    class RegDetPed : ObservableObject
    {
        string codigo, descripcion;
        double existencia, cantidad, recibido, descartado, adescartar, pendiente, costo;

        public string CODIGO
        {
            get { return codigo; }
            set
            {
                if (value != null)
                {
                    codigo = value.ToUpper();
                    CLSENCPPRP EncPprp = new CLSENCPPRP();
                    if (codigo.Length == 10)
                    {
                        if (EncPprp.ExisteMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4)))
                        {
                            DESCRIPCION = EncPprp.NombreMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
                            if (EXISTENCIA.ToString() == "" || EXISTENCIA == 0)
                            {
                                EXISTENCIA = EncPprp.ExistenciaMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
                            }
                            if (COSTO.ToString() == "" || COSTO == 0)
                            {
                                COSTO = EncPprp.CostoMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
                            }                            
                        }                        
                    }
                    RaisePropertyChangedEvent("CODIGO");
                }
            }
        }

        public string DESCRIPCION
        {
            get { return descripcion; }
            set { descripcion=value.ToUpper();
            RaisePropertyChangedEvent("DESCRIPCION");
            }
        }

        public double EXISTENCIA
        {
            get { return existencia; }
            set { existencia = value; }
        }

        public double CANTIDAD
        {
            get { return cantidad; }
            set { cantidad = value;
            RaisePropertyChangedEvent("CANTIDAD");
            }
        }

        public double RECIBIDO
        {
            get { return recibido; }
            set { recibido = value;
            RaisePropertyChangedEvent("RECIBIDO");
            }
        }

        public double DESCARTADO
        {
            get { return descartado; }
            set { descartado = value;
            RaisePropertyChangedEvent("DESCARTADO");
            }
        }

        public double ADESCARTAR
        {
            get { return adescartar; }
            set 
            { 
                adescartar = value;
                if (adescartar > PENDIENTE)
                {
                    adescartar = 0;
                }
            RaisePropertyChangedEvent("ADESCARTAR");
            }
        }

        public double PENDIENTE
        {
            get { return pendiente; }
            set { pendiente = value;
            RaisePropertyChangedEvent("PENDIENTE");
            }
        }

        public double COSTO
        {
            get { return costo; }
            set { costo = value;
            RaisePropertyChangedEvent("COSTO");
            }
        }
        //public event PropertyChangedEventHandler PropertyChanged;
    }
}

namespace ValidarEncPprp
{
    internal class ValidarCodigo : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value != null)
            {
                if (value.ToString().Length > 10 || value.ToString().Length < 10)
                {
                    return new ValidationResult(false, "El código debe ser de 10 caracteres");
                }

                CLSENCPPRP EncPprp = new CLSENCPPRP();

                if (value.ToString().Length == 10)
                {
                    if (!EncPprp.ExisteMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4)))
                    {
                        return new ValidationResult(false, "El código de materia prima no existe");
                    }
                }                
            }

            return new ValidationResult(true, null);
        }
    }

    internal class ValidarVal : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value.ToString() == null)
            {
                return new ValidationResult(false, "El valor no puede estar nulo");
            }
            if (value.ToString().Trim().Equals(""))
            {
                return new ValidationResult(false, "El valor no puede estar vacío");
            }
            if (!IsNumeric(value))
            {
                return new ValidationResult(false, "El valor debe ser numérico");
            }
            if (System.Convert.ToDouble(value)<0)
            {
                return new ValidationResult(false, "El valor no puede ser menor a cero");
            }
            return new ValidationResult(true, null);            
        }

        public bool IsNumeric(object Expression)
        {
            bool isNum;
            double retNum;

            isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
            return isNum;
        }
    }
}